changeset (改變集) 紀錄了
舉一個例子來解釋,假如在我們的系統上面存放著很多客戶資料,有一天我們想要幫一個舊的客戶更新電話,就會有以下步驟:
如圖所示 我們在轉入 changeset 的時候會檢查我們在 schema 設定好的資料驗證,
如果沒有錯誤就可以存入資料庫。
讓我們用前面新增的 Post 來練習看看
一樣使用 iex -S mix
先 alias 我們這次會用到的模組才不用打很多字
alias Blog.Repo
alias Blog.Posts.Post
複習一下上次用的拉出全部
Repo.all(Post)
但是這次我們拉一個就好,我們用 title 來撈,並用一個變數接起來
post_b = Repo.get_by(Post, title: "文章B")
如果忘記接起來 可以用 v 來取上一行的值
Repo.get_by(Post, title: "文章B") post_b = v
使用上次寫好的 Post.changeset 方法來加入改動組成 changeset
changeset = Post.changeset(post_b, %{body: "更新過的文章B內容"})
儲存!
Repo.update(changeset)
#=> {:ok, ...}
新增的流程跟剛剛差不多,只差在我們不用先撈舊的紀錄出來,給他一個空的 Post struct
changeset = Post.changeset(%Post{}, %{title: "全新的文章D"})
這個時候會發現 error 裡面有東西,整個 changeset 的 valid? 也是 false
因為我們在 Post.changeset 裡面有規定 title 跟 body 都是必填項目
這個時候如果 insert 會失敗
Repo.insert(changeset)
#=> {:error, ...}
重新 cast 一次
changeset = Post.changeset(%Post{}, %{title: "全新的文章D", body: "內容"})
Repo.insert(changeset)
#=> {:ok, ...}